/**
 * 游戏服务统一接口
 * 所有游戏服务都必须实现这个接口，提供统一的服务管理标准
 */

export interface ServiceStatus {
    readonly serviceName: string;
    readonly version: string;
    readonly isInitialized: boolean;
    readonly isHealthy: boolean;
    readonly lastHeartbeat: number;
    readonly errorCount: number;
    readonly dependencies: string[];
}

export interface HealthCheckResult {
    healthy: boolean;
    message: string;
    timestamp: number;
    details?: Record<string, any>;
}

export interface ServiceMetrics {
    callCount: number;
    avgResponseTime: number;
    errorRate: number;
    lastError?: {
        message: string;
        timestamp: number;
        stack?: string;
    };
}

/**
 * 游戏服务生命周期枚举
 */
export enum ServiceLifecycle {
    CREATED = 'created',
    INITIALIZING = 'initializing', 
    READY = 'ready',
    ERROR = 'error',
    DESTROYING = 'destroying',
    DESTROYED = 'destroyed'
}

/**
 * 统一的游戏服务接口
 */
export interface IGameService {
    /** 服务名称 */
    readonly serviceName: string;
    
    /** 服务版本 */
    readonly version: string;
    
    /** 当前生命周期状态 */
    readonly lifecycle: ServiceLifecycle;
    
    /** 服务依赖列表 */
    readonly dependencies: string[];

    /**
     * 初始化服务
     * @returns 初始化结果Promise
     */
    init(): Promise<void>;

    /**
     * 销毁服务
     * @returns 销毁结果Promise
     */
    destroy(): Promise<void>;

    /**
     * 获取服务状态
     * @returns 服务状态信息
     */
    getStatus(): ServiceStatus;

    /**
     * 健康检查
     * @returns 健康检查结果
     */
    healthCheck(): Promise<HealthCheckResult>;

    /**
     * 获取服务性能指标
     * @returns 性能指标信息
     */
    getMetrics(): ServiceMetrics;

    /**
     * 处理服务事件
     * @param event 事件名称
     * @param data 事件数据
     */
    onEvent?(event: string, data: any): Promise<void>;
}

/**
 * 服务配置接口
 */
export interface ServiceConfig {
    /** 是否启用该服务 */
    enabled?: boolean;
    
    /** 服务超时时间（毫秒） */
    timeout?: number;
    
    /** 最大重试次数 */
    maxRetries?: number;
    
    /** 健康检查间隔（毫秒） */
    healthCheckInterval?: number;
    
    /** 自定义配置 */
    custom?: Record<string, any>;
}

/**
 * 服务事件类型
 */
export enum ServiceEventType {
    INITIALIZED = 'initialized',
    ERROR = 'error',
    HEALTH_CHECK_FAILED = 'health_check_failed',
    DEPENDENCY_FAILED = 'dependency_failed',
    METRICS_UPDATED = 'metrics_updated'
}

/**
 * 服务事件接口
 */
export interface ServiceEvent {
    type: ServiceEventType;
    serviceName: string;
    timestamp: number;
    data: any;
}
